//
//  main.m
//  02-ClassAndObject
//
//  Created by dllo on 16/7/5.
//  Copyright © 2016年 yh. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Fraction.h"

int main(int argc, const char * argv[]) {
    
#if 0
    // 1. 快捷键
    // command + 0 开/收起左边栏
    // command + option + 0 开/收右边栏
    // command + shift + y 开/收下边栏
    // command + r 运行
    // command + c 复制
    // command + v 粘贴
    // command + b 编译
    // command + z 撤销
    // command + shift + z 反撤销
    // 移动光标
    // command + ← 最左移动
    // command + → 最右移动
    // command + ↑ 移动到所有行的第一行
    // command + ↓                   最后一行
    // 选中文字
    // shift + ← 向左选中一个文字
    // shift + → 向右选中一个文字
    // shift + ↑ 从光标开始选中向上一行 对应位置
    // shift + ↓ 从光标开始选中向下一行 对应位置
    // command + shift + ← 选中从光标开始左边所有的文字
    // command + shift + → 选中从光标开始右边所有的文字
    // command + shift + ↑ 选中从光标开始上边所有的文字
    // command + shift + ↓ 选中从光标开始下边所有的文字
    // command + n 快速创建一个文件
    // command + shift + n 快速创建一个工程
    
    // 1. 类和对象
    // 类: 一个具有相同特征和行为的事物的抽象集合
    // 对象: 类的实例. 也称作类的实现.
    
    // 面向对象的思想: 万物皆对象.
    // 面向对象语言是面向对象思想的具体体现
    // OOP 面向对象编程 OOD 面向对象设计
    // 面向对象的三大特征: 封装 继承 多态 (都是为了提高代码的复用)
    
    // 2. Objective-C(OC)
    // OC和C语言区别
    // OC属于C语言的扩展
    // OC中有类的概念
    // OC中声明属性和方法是在 .h中
    // OC中的实现是在 .m中
    // .mm(地图中 有) 文件是C++文件. 在这个文件中可以编写C++代码 (IOKit(输入/输出) 是用C++写的)
    
    // 创建一个类
    // OC中的根类 NSObject
    
    // 3. 创建OC的实例
    // 1) 消息语法 [object dosomething];    ([对象 方法];) 调用的是一个实例方法
    // 类方法调用(由类名调用+方法)
    // +alloc 给对象开辟空间
    NSObject *objec = [NSObject alloc];
    // 实例方法调用
    // init
    NSObject *newObjec = [objec init];
    // 创建一个 Person对象
    Person *per = [[Person alloc] init];
    per->_age = 10; // 公开的成员可以直接赋值取值
    NSLog(@"%ld", per->_age); // 取值
    
    // per->_name =  // 受保护的对象是不能直接通过箭头赋值
    
    // id 和 instancetype区别
    // instancetype 在作为参数返回值的时候 与id是一样的 系统编译器会把id类型转化成instancetype(即当前对象类型)
    // id可以作为变量类型使用 instancetype不可以
    
    // id object = [NSObject alloc];   可以
    // instancetype object1 = [instancetype alloc];   不可以
    
    // 堆区是程序员手动管理的 栈区是是系统管理的

    [per sleep:10];
    
    // super 是编译器指令
#endif
    
// 分数练习
    Fraction *fra1 = [[Fraction alloc] initWithNumrator:1 denominator:0];
    Fraction *fra2 = [[Fraction alloc] initWithNumrator:1 denominator:4];
   
   if ((fra1.denominator == 0) || (fra2.denominator == 0)) {
        NSLog(@"分数分母为零, 不能进行运算");
    } else {
        [[fra1 addWith:fra2] info];
        [[fra1 subWith:fra2] info];
        [[fra1 mulWith:fra2] info];
        [[fra1 divWith:fra2] info];
    }
    
    
    
    
    return 0;
}
